/*
 * IO.c
 *
 *  Created on: 2012-04-17
 *      Author: Bremen
 */

#include "IO.h"
#include "led.h"
#include "timer.h"


// FLAGI:
int masterFrame1 = 0; //kompletna 1 ramka do wyslania
int masterFrame2 = 0; //kompletna 2 ramka do wyslania
int masterSlaveFlag = 1; // 0 = slave, 1 = master
int ledSpeed = 1; // szybkosc chasowania ledow (prescaler)
char ledDirectionFlag = 'P'; // kierunki chasingu (L - LEWO i P - PRAWO);
int slaveAdress1 = 0; // 0x00, 0x01, 0x02, 0x03
int slaveAdress2 = 5; // 0x00, 0x01, 0x02, 0x03
int startStopFlag = 1; // start/ stop joy push. zaczyna start.
// flagi przyciskow:
int buttonStatePB0 = 0;
int buttonStatePB1 = 0;
int buttonStatePB2 = 0;

// tablica ledow (LED 0-2: sygnalizacja wlaczanych slaveow, LED7- Sygnalizacja mastera. (framework: led.h)
short LEDS[] = {LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7};
int disableTransfer = 1; // zezwolenie na wyslanie, 1- blokada, 0 - allow

int pushed = 0;

int ledOnBlink = 0;

void blinkLed(void){
	//TODO
	ledOnBlink++;
	int ii=0;
	for(ii=0; ii<=5; ii++) LED_Off(LEDS[ii]);

	if(ledOnBlink >=5) ledOnBlink=0;

	LED_On(LEDS[ledOnBlink]);
}

void setMaster(void){
	int ii = 0;
	masterSlaveFlag = !masterSlaveFlag;
	stopTimer(timer3SecID);
	ii = 0;
	for (ii = 0; ii <= 5; ii++)
		LED_Off(LEDS[ii]);
	if (1==masterSlaveFlag){
		LED_On(LEDS[6]);
	}else if (0==masterSlaveFlag){
		LED_Off(LEDS[6]);
	}


}

void initBlaBlab(void){
	masterSlaveFlag = 1;
	LED_On(LEDS[6]);
	timer3SecID = setTimer(setMaster, 3000, 1);
	dupaTimer("initBlaBlab \n");

}

void enableJoyInterrupts (void){ // odblokowanie przerwan od joya
	gpio_enable_pin_interrupt(GPIO_JOYSTICK_LEFT, GPIO_RISING_EDGE);
	gpio_enable_pin_interrupt(GPIO_JOYSTICK_RIGHT, GPIO_RISING_EDGE);
	gpio_enable_pin_interrupt(GPIO_JOYSTICK_UP, GPIO_RISING_EDGE);
	gpio_enable_pin_interrupt(GPIO_JOYSTICK_DOWN, GPIO_RISING_EDGE);
}

void disableJoyInterrupts (void){ // zablokowanie przerwan od joya
	gpio_disable_pin_interrupt(GPIO_JOYSTICK_LEFT);
	gpio_disable_pin_interrupt(GPIO_JOYSTICK_RIGHT);
	gpio_disable_pin_interrupt(GPIO_JOYSTICK_UP);
	gpio_disable_pin_interrupt(GPIO_JOYSTICK_DOWN);
}


// MASTER: Joy interrupt handler:
/*__attribute__((__interrupt__))*/ void interruptJoystick1(void){
        // Narazie tylko na push, bez 3 sec.
	if (gpio_get_pin_interrupt_flag(GPIO_JOYSTICK_PUSH) == 1){

                if (gpio_get_pin_value(GPIO_JOYSTICK_PUSH) == 1){
                	//if(1==pushed)
                	{
                		//stopTimer(timer3SecID);
                		pushed = 0;
                	}

                if (1 == isTimerOn(timer3SecID)){ // sprawdzanie czy trzyma 3 sec, jak nie to interupt start/ stop
                        masterFrame1 = slaveAdress1 | 32;
                        usart_putchar((&AVR32_USART1), masterFrame1);
                        if (slaveAdress2 != 5){
                                masterFrame2 = slaveAdress2 | 32;
                                usart_putchar((&AVR32_USART1), masterFrame2);
                        }
                	}
                	stopTimer(timer3SecID);
                }
                else if (gpio_get_pin_value(GPIO_JOYSTICK_PUSH) == 0){
                		pushed = 1;
                		startTimer(timer3SecID);
                }
                gpio_clear_pin_interrupt_flag(GPIO_JOYSTICK_PUSH);

	}
                // zmiana kierunku plywania diod w lewo
                if (gpio_get_pin_interrupt_flag(GPIO_JOYSTICK_LEFT) == 1 && masterSlaveFlag == 1 && disableTransfer == 0){
                        masterFrame1 = slaveAdress1 | 16;
                        usart_putchar((&AVR32_USART1), masterFrame1);
                        if (slaveAdress2 != 5){
                                masterFrame2 = slaveAdress2 | 16;
                                usart_putchar((&AVR32_USART1), masterFrame2);
                        }
                        ledDirectionFlag = 'L';
                        gpio_clear_pin_interrupt_flag(GPIO_JOYSTICK_LEFT);
                }

                // zmiana kierunku plywania diod w prawo
                if (gpio_get_pin_interrupt_flag(GPIO_JOYSTICK_RIGHT) == 1 && masterSlaveFlag == 1 && disableTransfer == 0){
                        masterFrame1 = slaveAdress1 | 8;
                        usart_putchar((&AVR32_USART1), masterFrame1);
                        if (slaveAdress2 != 5){
                                masterFrame2 = slaveAdress2 | 8;
                                usart_putchar((&AVR32_USART1), masterFrame2);
                        }
                        ledDirectionFlag = 'P';
                    gpio_clear_pin_interrupt_flag(GPIO_JOYSTICK_RIGHT);
                }

                // zwiekszanie predkosci plywania diod.
                if (gpio_get_pin_interrupt_flag(GPIO_JOYSTICK_UP) == 1 && masterSlaveFlag == 1 && disableTransfer == 0){
                        masterFrame1 = slaveAdress1 | 1;
                        usart_putchar((&AVR32_USART1), masterFrame1);
                        if (slaveAdress2 != 5){
                                masterFrame2 = slaveAdress2 | 1;
                                usart_putchar((&AVR32_USART1), masterFrame2);
                        }
                        ledSpeed *= 2;
                    gpio_clear_pin_interrupt_flag(GPIO_JOYSTICK_UP);
                }

                // zmniejszanie predkosci pluwania diod.
                if (gpio_get_pin_interrupt_flag(GPIO_JOYSTICK_DOWN) == 1 && masterSlaveFlag == 1 && disableTransfer == 0){
                        masterFrame1 = slaveAdress1 | 2;
                        usart_putchar((&AVR32_USART1), masterFrame1);
                        if (slaveAdress2 != 5){
                                masterFrame2 = slaveAdress2 | 2;
                                usart_putchar((&AVR32_USART1), masterFrame2);
                        }
                        ledSpeed *= 1/2;
                    gpio_clear_pin_interrupt_flag(GPIO_JOYSTICK_DOWN);
                }
}

// MASTER: Buttons interrupt handler
__attribute__((__interrupt__)) void interruptButtons(void){

        if (masterSlaveFlag == 1){

                // wysylanie do slavea 1:
                if (gpio_get_pin_interrupt_flag(GPIO_PUSH_BUTTON_0) == 1){
                	enableJoyInterrupts(); // odblokowanie przerwan joya
                        buttonStatePB0 ^= 1;
                        if(buttonStatePB0 == 1){
                                LED_On(LEDS[0]); // framework (led.h)
                        }
                        else {
                                LED_Off(LEDS[0]);
                        }
                        gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_0);
                }

                // wysylanie do slavea 2:
                if (gpio_get_pin_interrupt_flag(GPIO_PUSH_BUTTON_1) == 1){
                	enableJoyInterrupts(); // odblokowanie przerwan joya
                        buttonStatePB1 ^= 1;
                        if(buttonStatePB1 == 1){
                                LED_On(LEDS[1]);
                        }
                        else {
                                LED_Off(LEDS[1]);
                        }
                        gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_1);
                }

                // wysylanie do slavea 3:
                if (gpio_get_pin_interrupt_flag(GPIO_PUSH_BUTTON_2) == 1){
                	enableJoyInterrupts(); // odblokowanie przerwan joya
                        buttonStatePB2 ^= 1;
                        if(buttonStatePB2 == 1){

                                LED_On(LEDS[2]);
                        }
                        else {
                                LED_Off(LEDS[2]);
                        }
                        gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_2);
                }

                // modyfikacja ramki
                if      (buttonStatePB0 == 1 && buttonStatePB1 == 0 && buttonStatePB2 == 0){
                        disableTransfer = 0; // odblokowane przesylanie
                        slaveAdress1 = 0; // plytka 1, 00000000B
                        slaveAdress2 = 5; // blokada
                }
                else if (buttonStatePB0 == 0 && buttonStatePB1 == 1 && buttonStatePB2 == 0){
                        disableTransfer = 0; // odblokowane przesylanie
                        slaveAdress1 = 64; // plytka 2, 01000000B
                        slaveAdress2 = 5; // blokada
                }
                else if (buttonStatePB0 == 0 && buttonStatePB1 == 0 && buttonStatePB2 == 1){
                        disableTransfer = 0; // odblokowane przesylanie
                        slaveAdress1 = 128; // plytka 3, , 10000000B
                        slaveAdress2 = 5; // blokada
                }
                else if (buttonStatePB0 == 1 && buttonStatePB1 == 1 && buttonStatePB2 == 0){
                        disableTransfer = 0; // odblokowane przesylanie
                        slaveAdress1 = 0; // plytka 1
                        slaveAdress2 = 64; // plytka 2
                }
                else if (buttonStatePB0 == 1 && buttonStatePB1 == 0 && buttonStatePB2 == 1){
                        disableTransfer = 0; // odblokowane przesylanie
                        slaveAdress1 = 0; // plytka 1
                        slaveAdress2 = 128; // plytka 3
                }
                else if (buttonStatePB0 == 0 && buttonStatePB1 == 1 && buttonStatePB2 == 1){
                        disableTransfer = 0; // odblokowane przesylanie
                        slaveAdress1 = 64; // plytka 2
                        slaveAdress2 = 128; // plytka 3
                }
                else if (buttonStatePB0 == 1 && buttonStatePB1 == 1 && buttonStatePB2 == 1){
                        disableTransfer = 0; // odblokowane przesylanie
                        slaveAdress1 = 192; // plytka 1,2,3 BROADCAST, 11000000B
                        slaveAdress2 = 5; // blokada
                }
                else if (buttonStatePB0 == 0 && buttonStatePB1 == 0 && buttonStatePB2 == 0){
                        disableTransfer = 1; // nic z usarta nie wychodzi
                        disableJoyInterrupts (); // zablokowanie przerwan od joya kiedy nie ma slaveow
                }


        }
        else{
                gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_0);
                gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_1);
                gpio_clear_pin_interrupt_flag(GPIO_PUSH_BUTTON_2);
        }
}

